package br.com.rafaelSys.homes;

import static org.jboss.seam.ScopeType.SESSION;

import java.io.FileNotFoundException;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.framework.EntityHome;
import org.jboss.seam.international.StatusMessage.Severity;

import br.com.rafaelSys.entidades.Ativo;
import br.com.rafaelSys.entidades.AtivoSerie;
import br.com.rafaelSys.entidades.Carteira;
import br.com.rafaelSys.entidades.Usuario;
import br.com.rafaelSys.importacao.Importador;

@Name("ativoHome")
@Scope(ScopeType.CONVERSATION)
public class AtivoHome extends EntityHome<Ativo> {

	private static final long serialVersionUID = -2366622723095537386L;

	@In(create = true)
	private EntityManager entityManager;

	@In(required = true, scope = SESSION)
	private Usuario user;

	private List<AtivoSerie> series;
	private List<Carteira> carteiras;

	private boolean importar;

	@Override
	public String persist() {
		instance.setUsuario(user);
		instance.setUltimaAtualizacao(instance.getDataCargaInicial());
		super.persist();
		if (importar)
			importarSeries();
		return null;
	}

	@SuppressWarnings("unchecked")
	@Override
	public String remove() {

		Query query = entityManager.createNamedQuery("AtivoSerie.listByAtivo");
		query.setParameter("ativo", instance);

		List<AtivoSerie> series = query.getResultList();
		System.out.println("removendo: " + series.size());
		for (AtivoSerie s : series) {
			entityManager.remove(s);
		}

		return super.remove();
	}

	public String view() {
		System.out.println(instance + "view ativo <<<<<<<<<<<<<<<<<<<<,");
		if (instance != null) {
			atualizaSeries();
			atualizaCarteiras();
			System.out.println("view + series + ativo" + series.size());
		}

		return "view";
	}

	public List<AtivoSerie> getSeries() {
		return series;
	}

	public void setSeries(List<AtivoSerie> series) {
		this.series = series;
	}

	public String importarSeries() {
		Importador imp = new Importador(instance, entityManager);

		System.out.println("Atualizando... " + instance.getNome());
		try {
			imp.atualizarAtivo();
			System.out.println("oK! ");
			instance.setUltimaAtualizacao(new Date());
			FacesMessages.instance().add(Severity.INFO, imp.getCriacoes() + " Valores importados. " + imp.getAtualizacoes() + " Valores atualizados");
			atualizaSeries();
		} catch (FileNotFoundException fsfs) {
			FacesMessages.instance().add(Severity.WARN,
					"Houve algum erro durante a importa��o, tente dar carga inicial novamente ou crie o ativo com data inicial mais recente");
			fsfs.printStackTrace();
		}
		return "import";
	}

	public String cargaInicial() {
		Importador imp = new Importador(instance, entityManager);

		System.out.println("Carga Inicial... " + instance.getNome());
		try {
			imp.cargaInicial();
			System.out.println("oK! ");
			instance.setUltimaAtualizacao(new Date());
			FacesMessages.instance().add(Severity.INFO, imp.getCriacoes() + " Valores importados. " + imp.getAtualizacoes() + " Valores atualizados");
			atualizaSeries();
		} catch (FileNotFoundException fsfs) {
			FacesMessages.instance().add(Severity.WARN,
					"Houve algum erro durante a importa��o, tente dar carga inicial novamente ou crie o ativo com data inicial mais recente");
		}
		return "import";
	}

	@SuppressWarnings("unchecked")
	private void atualizaSeries() {
		Query query = entityManager.createNamedQuery("AtivoSerie.listByAtivo");
		query.setParameter("ativo", instance);
		series = query.getResultList();
	}

	@SuppressWarnings("unchecked")
	private void atualizaCarteiras() {
		Query query = entityManager.createNamedQuery("Ativo.checkCarteiras");
		query.setParameter("ativo", instance);
		carteiras = query.getResultList();
	}

	public boolean isImportar() {
		return importar;
	}

	public void setImportar(boolean importar) {
		this.importar = importar;
	}

	public List<Carteira> getCarteiras() {
		return carteiras;
	}

	public void setCarteiras(List<Carteira> carteiras) {
		this.carteiras = carteiras;
	}
}
